<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2数据_变量_内存</title>
</head>

<body>
    <!-- 
        1. 什么是数据？
            存储在内存中代表特定信息的'东西',本质上是0101的二进制数据
            数据的特点：可传递、可运算（算数运算，逻辑运算，拼接运算等）
        2. 什么是内存？
            -_- 无法解释，就是电脑硬件，（内存条通电后产生的可存储数据的看空间，断电后数据丢失）
            内存分为栈和堆（稍微有点麻烦，目前可以了解即可。）
                栈：全局变量/局部变量
                堆：对象
        3. 什么是变量？
            可变化的量，由变量名和变量值组成
            每个变量都对应的一块小内存，变量名用来查找对应的内存，变量值就是内存中保存的数据
        4. 内存， 数据， 变量三者之间的关系
            内存是用来存储数据的空间
            变量是内存的标识

     -->
    <script>
        let age = 18
        // 根据age这个名字去内存中寻找对应的数据18，这里直接存的18这个数据
        console.log(age);
        let obj = { name: 'Beauty' }
        // 这里是根据obj这个名字去内存中寻找对应的数据，这个数据是地址值。再根据这个地址值寻找对应的数据{name: 'Beauty'}
        console.log(obj)
        // 数据的传递
        let a = 3
        let b = a
    </script>

    <!-- 
        注意：
            1. let a = xxx, a内存中到底保存的是什么？
                xxx是基本数据，保存的就是这个数据
                let a = 1
                xxx是对象，保存的是对象的地址值
                let a = {}
                xxx是一个变量，保存的xxx的内存内容（可能是基本数据，也可能是地址值）
                let a = function(){}
                let b = a
                let a = 1
                let b = a
            2.关于引用变量赋值问题
                1.n个引用变量指向同一个对象，通过一个变量修改对象内部数据，其他所有变量看到的是修改之后的数据
                2.两个引用变量指向同一个对象，让其中一个对象指向一个新的对象，另一个引用变量依然指向前一个对象
            3. 在js调用函数时传递变量参数时，是值传递还是引用传递
                理解1：都是值传递（基本/地址值）
                理解2：可能是值传递，也可能是引用传递（当传的是基本类型时可以理解为值传递，当传的是引用类型时可以理解为引用传递）
            4. JS引擎如何管理内存？
                1. 内存生命周期
                    分配小内存空间，得到它的使用权
                    存储数据，可以反复进行操作
                    释放小内存空间
                2. 释放内存
                    局部变量： 函数执行完自动释放
                    对象： 成为垃圾对象才会被垃圾回收器回收
    -->
    <script>
        // 2.关于引用变量赋值问题
        let obj1 = { name: 'Beauty' }
        // 将obj1的内容赋值给obj2（obj1的内容是一个地址值）
        let obj2 = obj1
        obj1.name = 'Little Beauty'
        // 'Little Beauty'
        console.log(obj2.name)
        function fn(obj) {
            obj.name = 'Bi'
        }
        fn(obj1)
        // 'Bi'
        console.log(obj2.name)
        let a = { age: 12 }
        let b = a
        a = { name: 'Beauty', age: 13 }
        // 12，'Beauty', 13
        console.log(b.age, a.name, a.age)




        // 3. 内存管理
        // memory1占用了一块内存空间
        let memory1 = 1
        // memory2占用了两块内存空间（栈和堆各一块）
        let memory2 = {}
    </script>
</body>

</html>